from rest_framework import serializers
from .models import AbsentType,AbsentStatusChoices,Absent
from apps.oaauth.serializers import UserSerializer

class AbsentTypeSerializer(serializers.ModelSerializer):
    class Meta:
        model = AbsentType
        fields = '__all__'

class AbsentSerializer(serializers.ModelSerializer):
    # read_only 只会读，不会写
    # write_only 只会将data进行校验的时候才会赋值给字段
    type = AbsentTypeSerializer(read_only=True)
    type_id = serializers.IntegerField(write_only=True)
    requester = UserSerializer(read_only=True)
    responder = UserSerializer(read_only=True)
    start_time = serializers.DateTimeField(
        format='%Y-%m-%d',  # 输出时格式
        input_formats=[
            '%Y-%m-%dT%H:%M:%S.%fZ',  # ISO 格式（带Z）
            '%Y-%m-%dT%H:%M:%S.%f',  # ISO 格式（不带Z）
            '%Y-%m-%dT%H:%M:%S',  # 简化格式
            '%Y-%m-%d'  # 日期格式
        ]
    )
    end_time = serializers.DateTimeField(
        format='%Y-%m-%d',
        input_formats=[
            '%Y-%m-%dT%H:%M:%S.%fZ',
            '%Y-%m-%dT%H:%M:%S.%f',
            '%Y-%m-%dT%H:%M:%S',
            '%Y-%m-%d'
        ]
    )
    creat_time = serializers.DateTimeField(
        format='%Y-%m-%d',
        read_only=True  # 创建时间由模型自动生成，可以保持只读
    )

    class Meta:
        model = Absent
        fields = '__all__'

    # 验证type_id是否在数据库中存在
    def validate_type_id(self, value):  #value 就是用户提交的 type_id 字段的值。
        if not AbsentType.objects.filter(id=value).exists():
            raise serializers.ValidationError('考勤类型不存在')
        return value

    def create(self, validated_data):
        request = self.context.get('request')  #获取当前请求用户 ， DRF 自动帮你传入了 context
        user = request.user
        #获取审批者
        #如果是部门领导
        if user.department.leader.id == user.id:
            #如果是董事会
            if user.department.name == '董事会':
                responder = None
            else:
                responder = user.department.manage
        #如果不是部门领导
        else:
            responder = user.department.leader
        #如果是董事会成员就直接通过
        if responder is None:
            validated_data['status'] = AbsentStatusChoices.PASS
        else:
            validated_data['status'] = AbsentStatusChoices.AUDIING
        return Absent.objects.create(
            requester=user,
            responder=responder,
            **validated_data
        )

    def update(self, instance, validated_data):
        # instance是你要更新的模型对象，也就是： 当前数据库中已有的记录。
        if instance.status != AbsentStatusChoices.AUDIING:
            raise serializers.ValidationError('该考勤已处理，请勿重复处理')
        request = self.context.get('request')  # 获取当前请求用户 ， DRF 自动帮你传入了 context
        user = request.user
        if instance.responder.id != user.id:
            raise serializers.ValidationError('你没有权限处理该考勤')

        instance.status = validated_data['status']
        instance.reply_content = validated_data.get('reply_content')
        instance.save()
        return instance

